昨天把 K8s 的架構全貌看完了,今天會先針對「宣告式思維」的核心概念說清楚,然後直接寫 Pod YAML,把 Todo App 的後端跑在 K8s 上 !
在學 YAML 之前,先說明一個概念,因為這會影響你怎麼理解後面所有的 K8s 操作。
# 你說:「啟動一個 nginx container」
docker run nginx
# 你說:「我要一個跑著 nginx 的 Pod 存在」
apiVersion: v1
kind: Pod
spec:
containers:
- name: nginx
image: nginx
差別在哪?
每一份 K8s YAML 都有四個必填欄位:
apiVersion: v1 # 這個資源屬於哪個 API 版本
kind: Pod # 資源類型
metadata: # 這個資源的描述資訊
name: todo-api
spec: # 你期望這個資源長什麼樣子
containers:
- name: api
image: yourname/todo-app-api:v1.0.0
v1,其他資源(例如 Deployment)會用 apps/v1。Pod。name 是必填。今天目標:寫第一份 Pod YAML,把 Todo App 的後端跑在 K8s 上,並用 port-forward 直接打 API 確認它真的活著。
/Todo-APP/k8s目錄下,建立 todo-api-pod.yaml:apiVersion: v1
kind: Pod
metadata:
name: todo-api
spec:
containers:
- name: api
image: yourname/todo-app-api:v1.0.0
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
value: "mysql+pymysql://user:password@mysql-service:3306/tododb"
踩坑提醒:
- 請確認當前目錄是否正確( /Todo-App/k8s )
- todo-api-pod.yaml 中 image是否有調整成自己的 Docker hub name
# example spec: containers: - name: api image: demo223561/todo-app-api:v1.0.0 ports: - containerPort: 8000
# 進到k8s目錄
cd k8s
kubectl apply -f todo-api-pod.yaml
kubectl get pods

STATUS 是 Running、READY 是 1/1 就代表成功了。
kubectl describe pod todo-api
這個指令很常用,可以看到 Pod 的事件紀錄(Events),排查問題的時候會靠它。
kubectl logs todo-api
你會看到 FastAPI 啟動的輸出,確認應用程式有正常跑起來。
kubectl exec -it todo-api -- bash
# 退出
exit
跟 docker exec 一樣的概念,可以進到 Container 裡面看環境。
port-forward 暫時把 Pod 的 port 對應到本機:kubectl port-forward pod/todo-api 8000:8000
curl http://localhost:8000/todos
看到 API 回應就代表 Pod 正常運作了。
port-forward只是開發和除錯用的,不是正式的對外方式。要讓服務真正對外,需要 Service + Ingress,之後會學到
kubectl delete pod todo-api
# 或是用 YAML 刪除
kubectl delete -f todo-api-pod.yaml
Container 是應用程式的執行單位,由 Docker Image 跑起來的一個程序。
Pod 是 K8s 的最小調度單位,它是一個或多個 Container 的包裝。
Pod
├── Container A(主應用程式)
└── Container B(sidecar,選用)
大多數情況下,一個 Pod 裡只有一個 Container,所以很容易把兩者混淆。但 Pod 的設計允許多個 Container 共存,這些 Container 會:
localhost 互相溝通)最常見的是 Sidecar 模式:主 Container 跑應用程式,旁邊掛一個 Sidecar Container 負責 log 收集、代理、監控等輔助功能。對現在的 Todo App 來說,每個服務都是獨立的 Pod,各自一個 Container,這是最常見的做法。
今天學了兩件事:
apiVersion、kind、metadata、spec,後面的 K8s 資源都是這個結構。常用指令:
| 指令 | 說明 |
|---|---|
kubectl apply -f <file> |
套用 YAML |
kubectl get pods |
看 Pod 列表 |
kubectl describe pod <name> |
看 Pod 詳細狀態和事件 |
kubectl logs <name> |
看 Container log |
kubectl exec -it <name> -- bash |
進到 Pod 裡面 |
kubectl delete pod <name> |
刪除 Pod |
明天會學 Label 和 Selector,它是 K8s 裡元件互相找到對方的機制,也是後續 Deployment 和 Service 的運作基礎 !